package com.iias.common.util.arr;



import com.iias.common.util.rect.ZbFields;

import java.util.*;

/**
 * 常用集合操作工具类
 */
public class ZbCollectionUtils {

    /**
     * 去重 (均已实现了 hashCode() 可以使用)
     * @param <T>
     * @param <E>
     */
    public static  <T,E extends Collection<T>> void removal(E te){
        if (te.isEmpty())return;
        Set<T> tSet = new HashSet<T>();
        tSet.addAll(te);
        te.clear();
        te.addAll(tSet);
    }

    /**
     * 根据基础pojo 进行使用
     * 根据标示位的字段进行去重
     * @param te
     * @param fields  字段名称
     * @param <T>
     * @param <E>
     */
    public static <T,E extends Collection<T>> void removalField(E te,String... fields){
        if (te.isEmpty())return;
        T first = getFirstNotEmpty(te);
        if (first == null)return;
        Class tClass = first.getClass();
        Map<String,T> tMap = new LinkedHashMap<String, T>();
        for (T t : te) {
            tMap.put(ZbFields.getFieldValues(t, null, fields),t);
        }
        te.clear();
        te.addAll(tMap.values());
    }
    /**
     * 获取集合第一个对象
     * @param te
     * @param <T>
     * @param <E>
     * @return
     */
    public static <T,E extends Collection<T>> T getFirst(E te){
        if (te.isEmpty())return null;
        for (T t : te) {
            return t;
        }
        return null;
    }

    /**
     * 获取集合第一个不为空的对象
     * @param te
     * @param <T>
     * @param <E>
     * @return
     */
    public static <T,E extends Collection<T>> T getFirstNotEmpty(E te){
        if (te.isEmpty())return null;
        for (T t : te) {
            if (t == null) continue;
            return t;
        }
        return null;
    }


    /**
     * 将LIST 按指定的长度截取
     * @param tList
     * @param sub
     * @param <T>
     * @return
     */
    public static <T> List<T>[] subArrays(List<T> tList,int sub){
        if (sub <= 0){
            return null;
        }
        int size = tList.size();
        int nums= size/sub;
        nums = size%sub == 0?nums:nums+1;
        List<T>[] subs = new List[nums];
        for (int i = 0 ;i<nums;i++){
            int start = i*sub;
            int end = (i+1)*sub;
            if (end>size){
                end=size;
            }
            subs[i] = tList.subList(start, end);
        }
        return subs;
    }


    public static<T> int indexOf(Collection<T> tCollection,Object obj){
        int index = -1;
        for (T t : tCollection) {
            if (t.equals(obj)) {
                return index;
            }
        }
        return index;
    }


    public static <T> T indexObj(Collection<T> tCollection,Object obj){
        for (T t : tCollection) {
            if (t.equals(obj)) {
                return t;
            }
        }
        return null;
    }


    /**
     * 将元素封装成list  方便操作
     * @param ts
     * @param <T>
     * @return
     */
    public static <T> List<T> arrToList(T ... ts){
        List<T> tList = new ArrayList<T>(ts.length);
        for (T t : ts) {
            tList.add(t);
        }
        return tList;
    }


}
